# 导入必要的库
import pandas as pd  # 用于数据处理和分析
import matplotlib.pyplot as plt  # 用于数据可视化

# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体显示中文
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
file_path_clear='../../data/cleared data/'
file_path_image='../../data/image/'
# 第一部分：各菜品类别总销售占比分布分析


# 第二部分：门店销售占比分析功能
def generate_store_sales_pie(store_id):
    """
    根据销售记录生成指定门店内部各类菜品销售占比饼状图
    参数：store_id - 门店ID
    """
    try:
        # 读取三个数据文件：销售记录、门店信息、菜品信息
        sales_df = pd.read_excel(file_path_clear+"餐饮连锁品牌数据_销售记录3_cleaned.xlsx")
        store_info_df = pd.read_excel(file_path_clear+"餐饮连锁品牌数据_门店信息2_cleaned.xlsx")
        dish_info_df = pd.read_excel(file_path_clear+"餐饮连锁品牌数据_菜品信息4_cleaned.xlsx")

        # 获取指定门店的所有销售记录
        store_sales = sales_df[sales_df['门店ID'] == store_id]

        # 检查门店是否存在销售记录
        if store_sales.empty:
            print(f"错误: 未找到门店 {store_id} 的销售记录")
            return

        # 合并销售记录和菜品信息，获取菜品类别
        store_sales_with_category = store_sales.merge(
            dish_info_df[['菜品ID', '菜品类别']],  # 选择需要的列
            on='菜品ID',  # 按菜品ID合并
            how='left'  # 左连接，保留所有销售记录
        )

        # 按菜品类别统计销售数量
        category_sales = store_sales_with_category.groupby('菜品类别')['销售数量'].sum().reset_index()

        # 检查是否有有效的销售记录
        if category_sales.empty:
            print(f"错误: 门店 {store_id} 没有有效的销售记录")
            return

        # 获取门店详细信息
        store_info = store_info_df[store_info_df['门店ID'] == store_id]
        store_name = store_info['门店名称'].iloc[0] if not store_info.empty else store_id
        store_city = store_info['所在城市'].iloc[0] if not store_info.empty else ""

        # 计算各类别销售占比
        total_sales = category_sales['销售数量'].sum()  # 总销售数量
        category_sales['占比(%)'] = (category_sales['销售数量'] / total_sales) * 100  # 计算百分比

        # 创建门店销售占比饼图
        plt.figure(figsize=(10, 8))

        # 定义颜色列表，支持最多8个类别
        colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEAA7', '#DDA0DD', '#98D8C8', '#FFB347']

        # 使用分开参数写法绘制饼图
        wedges, texts, autotexts = plt.pie(
            category_sales['占比(%)'],  # 占比数据
            labels=category_sales['菜品类别'],  # 类别标签
            autopct='%1.1f%%',  # 百分比格式
            colors=colors[:len(category_sales)],  # 根据类别数量取颜色
            startangle=90,  # 起始角度
            textprops={'fontsize': 11}  # 文本属性
        )

        # 美化百分比文字：白色加粗，稍小字体
        for autotext in autotexts:
            autotext.set_color('white')
            autotext.set_fontweight('bold')
            autotext.set_fontsize(10)

        # 设置图表标题，包含门店信息和总销量
        plt.title(f'{store_id} {store_name}\n{store_city} - 各类菜品销售占比\n总销售数量: {total_sales}',
                  fontsize=14, fontweight='bold', pad=20)
        plt.axis('equal')  # 保证饼图为圆形
        plt.tight_layout()  # 自动调整布局
        plt.show()  # 显示图表

        # 输出详细的销售数据
        print(f"\n{store_id} {store_name} ({store_city})")
        print("=" * 60)
        print("各类菜品销售占比详情:")
        for _, row in category_sales.iterrows():
            print(f"  {row['菜品类别']}: {row['占比(%)']:.1f}% (销售数量: {row['销售数量']})")
        print(f"总销售数量: {total_sales}")
        print("=" * 60)

    except FileNotFoundError as e:
        # 处理文件不存在错误
        print(f"文件读取错误: {e}")
        print("请确保以下文件在当前目录中:")
        print("1. 餐饮连锁品牌数据_销售记录3_cleaned.xlsx")
        print("2. 餐饮连锁品牌数据_门店信息_cleaned.xlsx")
        print("3. 餐饮连锁品牌数据_菜品信息4_cleaned.xlsx")
    except Exception as e:
        # 处理其他异常
        print(f"生成图表时出错: {e}")


def show_all_stores():
    """
    显示所有有销售记录的门店列表
    """
    try:
        # 读取销售记录和门店信息
        sales_df = pd.read_excel(file_path_clear+"餐饮连锁品牌数据_销售记录3_cleaned.xlsx")
        store_info_df = pd.read_excel(file_path_clear+"餐饮连锁品牌数据_门店信息2_cleaned.xlsx")

        # 获取有销售记录的门店ID（去重）
        stores_with_sales = sales_df['门店ID'].unique()

        # 合并门店信息，只保留有销售记录的门店
        stores_info = store_info_df[store_info_df['门店ID'].isin(stores_with_sales)]

        # 显示门店列表
        print("有销售记录的门店ID:")
        print("-" * 50)
        for i, (_, row) in enumerate(stores_info.iterrows(), 1):
            print(f"{i:2d}. {row['门店ID']} - {row['门店名称']} ({row['所在城市']})")
        print("-" * 50)

    except FileNotFoundError:
        print("无法读取门店列表，请检查文件是否存在")


# 主程序入口
if __name__ == "__main__":
    # 显示所有有销售记录的门店列表
    show_all_stores()

    # 设置目标门店ID（可以修改这个值查看不同门店）
    target_store = 'STO008'

    # 生成指定门店的销售占比饼图
    print(f"\n正在生成门店 {target_store} 的销售占比饼状图...")
    generate_store_sales_pie(target_store)
    #保存图片
    plt.savefig(file_path_image+f'{target_store}_销售占比饼状图.png', dpi=150, bbox_inches='tight')
